home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / Benchmark / Timer.php < prev   
PHP Script  |  2004-03-24  |  8KB  |  255 lines

  1. <?php
  2. //
  3. // +------------------------------------------------------------------------+
  4. // | PEAR :: Benchmark                                                      |
  5. // +------------------------------------------------------------------------+
  6. // | Copyright (c) 2001-2003 Sebastian Bergmann <sb@sebastian-bergmann.de>. |
  7. // +------------------------------------------------------------------------+
  8. // | This source file is subject to version 3.00 of the PHP License,        |
  9. // | that is available at http://www.php.net/license/3_0.txt.               |
  10. // | If you did not receive a copy of the PHP license and are unable to     |
  11. // | obtain it through the world-wide-web, please send a note to            |
  12. // | license@php.net so we can mail you a copy immediately.                 |
  13. // +------------------------------------------------------------------------+
  14. //
  15. // $Id: Timer.php,v 1.7 2002/12/11 17:14:17 sebastian Exp $
  16. //
  17.  
  18. /**
  19.  * Benchmark::Timer
  20.  *
  21.  * Purpose:
  22.  *
  23.  *     Timing Script Execution, Generating Profiling Information
  24.  *
  25.  * Example with automatic profiling start, stop, and output:
  26.  *
  27.  *     $timer =& new Benchmark_Timer(true);
  28.  *     $timer->setMarker('Marker 1');
  29.  *
  30.  * Example without automatic profiling:
  31.  *
  32.  *     $timer =& new Benchmark_Timer();
  33.  *
  34.  *     $timer->start();
  35.  *     $timer->setMarker('Marker 1');
  36.  *     $timer->stop();
  37.  *
  38.  *     $profiling = $timer->getProfiling();
  39.  *     echo $profiling->getOutput(); // or $timer->display()
  40.  *
  41.  * Contributors:
  42.  * - Ludovico Magnocavallo <ludo@sumatrasolutions.com>
  43.  *   auto profiling and get_output() method
  44.  *
  45.  * @author   Sebastian Bergmann <sb@sebastian-bergmann.de>
  46.  * @version  $Revision: 1.7 $
  47.  * @access   public
  48.  */
  49.  
  50. require_once 'PEAR.php';
  51.  
  52. class Benchmark_Timer extends PEAR
  53. {
  54.     /**
  55.      * Contains the markers
  56.      *
  57.      * @var    array
  58.      * @access private
  59.      */
  60.     var $markers = array();
  61.  
  62.     /**
  63.      * Auto-start and stop timer
  64.      *
  65.      * @var    boolean
  66.      * @access private
  67.      */
  68.     var $auto   = false;
  69.  
  70.     /**
  71.      * Max marker name length for non-html output
  72.      *
  73.      * @var    integer
  74.      * @access private
  75.      */
  76.     var $strlen_max = 0;
  77.  
  78.     /**
  79.      * Constructor, starts profiling recording
  80.      *
  81.      * @access public
  82.      */
  83.     function Benchmark_Timer($auto = false) {
  84.         $this->PEAR();
  85.         if ($auto) {
  86.             $this->auto = $auto;
  87.             $this->start();
  88.         }
  89.     }
  90.  
  91.     /**
  92.      * Destructor, stops profiling recording
  93.      *
  94.      * @access private
  95.      */
  96.     function _Benchmark_Timer() {
  97.         if ($this->auto) {
  98.             $this->stop();
  99.             $this->display();
  100.         }
  101.     }
  102.  
  103.     /**
  104.      * Return formatted profiling information.
  105.      *
  106.      * @see    getProfiling()
  107.      * @access public
  108.      */
  109.     function getOutput()
  110.     {
  111.         if (function_exists('version_compare') &&
  112.             version_compare(phpversion(), '4.1', 'ge'))
  113.         {
  114.             $http = isset($_SERVER['SERVER_PROTOCOL']);
  115.         } else {
  116.             global $HTTP_SERVER_VARS;
  117.             $http = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']);
  118.         }
  119.         $total = $this->TimeElapsed();
  120.         $result = $this->getProfiling();
  121.         $dashes = "";
  122.         if ($http) {
  123.             $out = "<table border=1>\n";
  124.             $out .= '<tr><td> </td><td align="center"><b>time index</b></td><td align="center"><b>ex time</b></td><td align="center"><b>%</b></td></tr>'."\n";
  125.         } else {
  126.             $dashes = $out = str_pad("\n", ($this->strlen_max + 52), '-', STR_PAD_LEFT);
  127.             $out .= str_pad('marker', $this->strlen_max);
  128.             $out .= str_pad("time index", 22);
  129.             $out .= str_pad("ex time", 22);
  130.             $out .= "perct\n";
  131.             $out .= $dashes;
  132.         }
  133.         foreach ($result as $k => $v) {
  134.             $perc = (($v['diff'] * 100) / $total);
  135.             if ($http) {
  136.                 $out .= "<tr><td><b>" . $v['name'] . "</b></td><td>" . $v['time'] . "</td><td>" . $v['diff'] . "</td><td align=\"right\">" . number_format($perc, 2, '.', '') . "%</td></tr>\n";
  137.             } else {
  138.                 $out .= str_pad($v['name'], $this->strlen_max, ' ');
  139.                 $out .= str_pad($v['time'], 22);
  140.                 $out .= str_pad($v['diff'], 22);
  141.                 $out .= str_pad(number_format($perc, 2, '.', '') . "%\n", 8, ' ', STR_PAD_LEFT);
  142.             }
  143.             $out .= $dashes;
  144.         }
  145.         if ($http) {
  146.             $out .= "<tr style='background: silver;'><td><b>total</b></td><td>-</td><td>${total}</td><td>100.00%</td></tr>\n";
  147.             $out .= "</table>\n";
  148.         } else {
  149.             $out .= str_pad('total', $this->strlen_max);
  150.             $out .= str_pad('-', 22);
  151.             $out .= str_pad($total, 22);
  152.             $out .= "100.00%\n";
  153.             $out .= $dashes;
  154.         }
  155.         return $out;
  156.     }
  157.  
  158.     /**
  159.     * Prints the information returned by getOutput
  160.     */
  161.     function display()
  162.     {
  163.         print $this->getOutput();
  164.     }
  165.  
  166.     /**
  167.      * Set "Start" marker.
  168.      *
  169.      * @see    setMarker(), stop()
  170.      * @access public
  171.      */
  172.     function start() {
  173.         $this->setMarker('Start');
  174.     }
  175.  
  176.     /**
  177.      * Set "Stop" marker.
  178.      *
  179.      * @see    setMarker(), start()
  180.      * @access public
  181.      */
  182.     function stop() {
  183.         $this->setMarker('Stop');
  184.     }
  185.  
  186.     /**
  187.      * Set marker.
  188.      *
  189.      * @param  string  name of the marker to be set
  190.      * @see    start(), stop()
  191.      * @access public
  192.      */
  193.     function setMarker($name) {
  194.         $microtime = explode(' ', microtime());
  195.         $this->markers[$name] = $microtime[1] . substr($microtime[0], 1);
  196.     }
  197.  
  198.     /**
  199.      * Returns the time elapsed betweens two markers.
  200.      *
  201.      * @param  string  $start        start marker, defaults to "Start"
  202.      * @param  string  $end          end marker, defaults to "Stop"
  203.      * @return double  $time_elapsed time elapsed between $start and $end
  204.      * @access public
  205.      */
  206.     function timeElapsed($start = 'Start', $end = 'Stop') {
  207.         if (extension_loaded('bcmath')) {
  208.             return bcsub($this->markers[$end], $this->markers[$start], 6);
  209.         } else {
  210.             return $this->markers[$end] - $this->markers[$start];
  211.         }
  212.     }
  213.  
  214.     /**
  215.      * Returns profiling information.
  216.      *
  217.      * $profiling[x]['name']  = name of marker x
  218.      * $profiling[x]['time']  = time index of marker x
  219.      * $profiling[x]['diff']  = execution time from marker x-1 to this marker x
  220.      * $profiling[x]['total'] = total execution time up to marker x
  221.      *
  222.      * @return array $profiling
  223.      * @access public
  224.      */
  225.     function getProfiling() {
  226.         $i = $total = $temp = 0;
  227.         $result = array();
  228.  
  229.         foreach ($this->markers as $marker => $time) {
  230.             if (extension_loaded('bcmath')) {
  231.                 $diff  = bcsub($time, $temp, 6);
  232.                 $total = bcadd($total, $diff, 6);
  233.             } else {
  234.                 $diff  = $time - $temp;
  235.                 $total = $total + $diff;
  236.             }
  237.  
  238.             $result[$i]['name']  = $marker;
  239.             $result[$i]['time']  = $time;
  240.             $result[$i]['diff']  = $diff;
  241.             $result[$i]['total'] = $total;
  242.  
  243.             $this->strlen_max = (strlen($marker) > $this->strlen_max ? strlen($marker) + 1 : $this->strlen_max);
  244.  
  245.             $temp = $time;
  246.             $i++;
  247.         }
  248.         $result[0]['diff'] = '-';
  249.         $this->strlen_max = (strlen('total') > $this->strlen_max ? strlen('total') : $this->strlen_max);
  250.         $this->strlen_max += 4;
  251.         return $result;
  252.     }
  253. }
  254. ?>
  255.